# Использование социальных сетей для аутентификации пользователей

В данной задаче вам необходимо будет написать функцию аутентификации пользователей социальных сетей,
эта функция может быть в дальнейшем использована для любой социальной сети. Код функции должен 
находиться в файле `libs/strategies/authenticate.js`.

Суть этой функции сводится к тому, что она принимает одни и те же данные от разных социальный сетей
(email и имя пользователя), и далее, если пользователь с указанным email уже есть в нашей базе - 
успешно его аутентифицирует, если же пользователя нет - создаёт для него новый документ и 
аутентифицирует после создания. Таким образом, логика функции, которую вам необходимо реализовать:
1. Убедиться в том, что поле `email` передано.
2. Попытаться найти пользователя по переданному `email`.
3. Если пользователь есть - аутентифицировать его (передав в коллбек стратегии `done` объект 
пользователя).
4. Если пользователя нет - создать для него новый документ и аутентифицировать.


Любая OAuth-стратегия для `passport` получает данные пользователя от самой социальной сети, и формат
может немного отличаться. Например, поле `email` в случае с github и facebook возвращается в поле
`profile.emails[0].value`, а в случае vkontakte - в поле `params.email`. Это важный момент, который
стоит учитывать при подключении новой стратегии - всегда проверяйте формат ответа социальной сети,
чтобы знать каким образом получить данные пользователя.


## Github

Ниже находится инструкция для регистрации вашего собственного OAuth приложения на Github.

Добавление нового приложения:
    - Перейдите на [страницу настроек](https://github.com/settings/developers).
    - Нажмите на [кнопку](https://github.com/settings/applications/new) создания нового приложения.

Заполните поля для регистрации приложения:

|  Поле | Описание |
|---|---|
| Application name | Название вашего приложения |
| Homepage URL | http://localhost:3000 |
| Application description  | Необязательное поле - описание вашего приложения | 
| Authorization callback URL  | http://localhost:3000/oauth/github |

*Обратите внимание, поле **Authorization callback URL** содержит адрес сайта, куда пользователь 
будет перенаправлен после завершения авторизации. Так как пока вся разработка ведется локально - 
адрес сайта должен быть именно таким как в таблице, то есть `http://localhost:3000/oauth/github`.

После успешной регистрации приложения вы получите значения `Client ID` и `Client Secret`, которые 
можно указать в файле `config.js` и использовать для локальной аутентификации через Github.

**Не выкладывайте, пожалуйста, секретные ключи на github, это небезопасно** 

## Другие социальные сети

Похожим образом выполняется регистрация приложения в любой социальной сети, текущий клиент имеет 
кнопки для аутентификации через vkontakte и facebook, использовать их вы можете уже сейчас, 
`callback url` для vkontakte должен быть `http://localhost:3000/oauth/vkontakte`, для facebook - 
`http://localhost:3000/oauth/facebook`.

## Локальное тестирование

В папке `public` находится код клиентского приложения, написанного с использованием React, которое
позволяет увидеть и оценить процесс аутентификации со стороны наших пользователей. После того, как
вы создадите одно или несколько приложений в социальных сетях, укажите их `clientId` и `clientSecret`
в файле `config.js`, а затем после запуска сервера, перейдите на страницу `http://localhost:3000`.
С помощью инструментов devtools вы можете отслеживать все запросы, которые осуществляет браузер.
